package com.itheima.stock.Thread;

import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;

/*
   方式三：实现Callable接口
   V call()	计算结果，如果无法计算结果，则抛出一个异常
   FutureTask(Callable callable)	创建一个 FutureTask，一旦运行就执行给定的 Callable
   V get()	如有必要，等待计算完成，然后获取其结果


   实现步骤

     定义一个类MyCallable实现Callable接口
     在MyCallable类中重写call()方法
     创建MyCallable类的对象
     创建Future的实现类FutureTask对象，把MyCallable对象作为构造方法的参数
     创建Thread类的对象，把FutureTask对象作为构造方法的参数
     启动线程
     再调用get方法，就可以获取线程结束之后的结果。
 */
public class MyCallable implements Callable<Object> {
    @Override
    public Object call() throws Exception {
        for (int i = 0; i < 10; i++) {
            System.out.println("和女神表白的第：" + i + "次");
        }
        return "答应";
    }
}

/*
         创建Future的实现类FutureTask对象，把MyCallable对象作为构造方法的参数
         创建Thread类的对象，把FutureTask对象作为构造方法的参数
         启动线程
         再调用get方法，就可以获取线程结束之后的结果。
*/
class MyCallableTest {
    public static void main(String[] args) {

        try {
            //线程开启之后需要执行里面的call方法
            MyCallable myCallable = new MyCallable();
            //可以获取线程执行完毕之后的结果.也可以作为参数传递给Thread对象
            FutureTask futureTask = new FutureTask<>(myCallable);
            Thread thread = new Thread(futureTask);
            //启动线程
            thread.start();
            //获取线程执行完毕之后的结果
            String o = (String) futureTask.get();
            System.out.println(o);
        } catch (InterruptedException | ExecutionException e) {
            throw new RuntimeException(e);
        }
    }
}
